/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package fr.afcepf.projet2.metiers.webservices.commandes;

import fr.afcepf.projet2.metiers.donnees.assembleur.commandes.CommandeAssembleur;
import fr.afcepf.projet2.metiers.donnees.assembleur.commandes.LigneCommandeAssembleur;
import fr.afcepf.projet2.metiers.donnees.assembleur.commandes.ModeLivraisonAssembleur;
import fr.afcepf.projet2.metiers.donnees.assembleur.commandes.ModePaiementAssembleur;
import fr.afcepf.projet2.metiers.donnees.dao.interfaces.commandes.IDaoCommande;
import fr.afcepf.projet2.metiers.donnees.dao.interfaces.commandes.IDaoLigneCommande;
import fr.afcepf.projet2.metiers.donnees.dao.interfaces.commandes.IDaoModeLivraison;
import fr.afcepf.projet2.metiers.donnees.dao.interfaces.commandes.IDaoModePaiement;
import fr.afcepf.projet2.metiers.donnees.dto.commandes.CommandeDto;
import fr.afcepf.projet2.metiers.donnees.dto.commandes.LigneCommandeDto;
import fr.afcepf.projet2.metiers.donnees.dto.commandes.ModeLivraisonDto;
import fr.afcepf.projet2.metiers.donnees.dto.commandes.ModePaiementDto;
import fr.afcepf.projet2.metiers.donnees.dto.comptes.UtilisateurDto;
import fr.afcepf.projet2.metiers.donnees.entites.commandes.Commande;
import fr.afcepf.projet2.metiers.donnees.entites.commandes.LigneCommande;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.ejb.EJB;
import javax.ejb.Stateless;
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebService;

/**
 * Implémentation du web service qui gère les commandes
 * @author Wahida
 */
@WebService(serviceName = "WsCommandes")
@Stateless
public class WsCommandes{
    @EJB
    private IDaoCommande iDaoCommande;
    @EJB
    IDaoLigneCommande iDaoLigneCommande;
    @EJB
    IDaoModeLivraison iDaoModeLivraison;
    @EJB
    IDaoModePaiement iDaoModePaiement;
    /**
     * Permet de récupérer toutes les commandes d'un client
     * @param utilisateur
     * @return liste de CommandeDto de l'utilisateur passé en paramètre
     */
    @WebMethod(operationName = "getCommandeByClient")
    public List<CommandeDto> getCommandeByClient(
            @WebParam(name = "utilisateur") final UtilisateurDto utilisateur) 
            {
         Map<String, Object> args = new HashMap<>();
         args.put("utilisateur", utilisateur);
         List<Commande> listeCommande = iDaoCommande.rechercherParNamedQueryEtArguments(
                   "Commande.findByUtilisateur", args);
        return CommandeAssembleur.creationListeCommandeDto(listeCommande);

    }

  /**
     *  Permet de récupérer les lignes de commandes d'une commande
     * @param commande
     * @return La liste des lignes de commandes
     */
    @WebMethod(operationName = "getLignesCommandes")
    public List <LigneCommandeDto> getLignesCommandes(
            @WebParam(name = "commande")final CommandeDto commande) {
        return new ArrayList(commande.getLigneCommandes());
    }

    /**
     * Permet de créer une commande en supposant que les lignes commandes
     * seront ajoutées automatiquement
     * @param commandeDto
     * @return
     */
    @WebMethod(operationName = "creerCommande")
    public void creerCommande(
            @WebParam(name = "commande")final CommandeDto commandeDto) {
            Commande commande = CommandeAssembleur.updateCommande(commandeDto);
            iDaoCommande.ajouter(commande);
    }

     /**
     * Variante de créerCommande
     * Permet de créer une commande et ajouter les lignes commande manuellement
     * @param commandeDto
     * @return
     */
    @WebMethod(operationName = "creerCommandeBis")
    public void creerCommandeBis(
            @WebParam(name = "commande")final CommandeDto commandeDto) {
            Commande  commande = iDaoCommande.ajouter(	
                    CommandeAssembleur.updateCommande(commandeDto));	
            	
            for(LigneCommandeDto ligneCommandeDto : commandeDto.getLigneCommandes()){	
                LigneCommande ligneCommande = iDaoLigneCommande.ajouter(	
                        LigneCommandeAssembleur.updateLigneCommande(ligneCommandeDto));

                iDaoCommande.ajouterLigneCommande(commande.getIdCommande().intValue(),
                        ligneCommande.getIdLigneCommande().intValue());	
             }	
    }
    /**
     *  Permet de récupérer une commande à partir de son identifiant
     * @param idCommande
     * @return la commande correspondant
     */
    @WebMethod(operationName = "getCommandeById")
    public CommandeDto getCommandeById(
            @WebParam(name = "idCommande")final int idCommande) {
        Commande commande = 
                iDaoCommande.obtenirParId(idCommande);

       return CommandeAssembleur.creationCommandeDto(commande) ;
    }

    /**	
     * Permet de calculer le prix total de la commande à partir 	
     * de toutes les lignes de commande	
     * @param commande	
     * @return le prix total de la commande	
     */	
     @WebMethod(operationName = "calculerPrixTotal")	
     public BigDecimal calculerPrixTotal(
             @WebParam(name = "commande") final CommandeDto commande) {	
        BigDecimal prixTotal = new BigDecimal(0);	
       for(LigneCommandeDto ligneCommandeDto : commande.getLigneCommandes()){	
           BigDecimal prixLigne = ligneCommandeDto.getPrixProduit();	
            prixLigne.multiply(new BigDecimal(ligneCommandeDto.getQuantite()));	
            prixTotal.add(prixLigne);
        }	
        return prixTotal;	
    }
     
         /**
     * Permet de récupérer la liste des type d'utilisateur
     * @return liste de type d'utilisateur
     */
    @WebMethod(operationName = "getAllModeLivraison")
        public List<ModeLivraisonDto> getAllModeLivraison(){
        return ModeLivraisonAssembleur
                .creationListeModeLivraisonDto(
                iDaoModeLivraison
                .rechercherParNamedQuery(
                "ModeLivraison.findAll"));
    }
    
     /**
     * Permet de récupérer la liste des mode de livraison
     * @return liste de mode de livraison
     */
    @WebMethod(operationName = "getAllModePaiement")
        public List<ModePaiementDto> getAllModePaiement() {
        return ModePaiementAssembleur
                .creationListeModePaiementDto(iDaoModePaiement
                .rechercherParNamedQuery(
                "ModePaiement.findAll"));
    }     
}
